package model;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import entity.Deck;
import entity.Discard;
import entity.Hand;
import entity.Poker;
import entity.PokerPile;
import entity.SevPile;
import entity.Suit;
import entity.SuitPile;

public class GameModel {
	private Deck deck;//牌堆
	private Hand hand;//手牌
	private SevPile sevPile[];//下方牌组/
	private SuitPile suitPile[];//Sup牌组
	private PokerPile lastPile;//上一个牌堆
	private int level;//难度等级
	public GameModel(int level) {
		if(level<-1||level>2)
			level=2;
		level=-1;
		// 为相关变量申请空间
		if(level==-1)
			setDebugCondition();
		else
			refreshPokers();
		this.level=level;
	}
	public void refreshPokers(){
		List<Poker> randomList=getRandmoPokers();
		sevPile=new SevPile[7];
		deck=new Deck(randomList.subList(0, 24));	//首先向deck中放入24张牌
		int cur=24;//当前24张牌已经被取走
		for(int i=0;i<7;i++){	//依次将牌放入下方牌组
			sevPile[i]=new SevPile(randomList.subList(cur, cur+i+1));	
			cur+=i+1;
		}
		setHand(new Hand());	//新建手牌
		suitPile=new SuitPile[4];//新建四个SuitPile牌堆
		for(int i=0;i<4;i++)
			suitPile[i]=new SuitPile();
		lastPile=null;//一开始上一个牌堆没有东西
	}
	/**获取难度等级
	 * 
	 * @return
	 */
	public int getLevel(){
		return level;
	}
	/**设置难度
	 * 
	 * @param level 难度
	 * @return
	 */
	public void setLevel(int level){
		this.level=level;
	}
	/**获取任意顺序的扑克牌的List集合
	 * 
	 * @return
	 */
	public List<Poker> getRandmoPokers(){
		List<Poker> pokCho=new ArrayList<>();	//构建一个List
		List<Poker> res=new ArrayList<>();//即将返回的值
		for(int i=0;i<52;i++)	//为list赋初值
			pokCho.add(new Poker(i%13+1, Suit.values()[i/13]));
		Random random=new Random();
		for(int i=0;i<52;i++){	//遍历PokChoSize的长度
			int cur=random.nextInt(pokCho.size());
			res.add(pokCho.get(cur));	//向res中加入新产生的牌
			pokCho.remove(cur);	//将加入返回结果的牌从所有牌中移除
		}
		return res;
	}
	/**设置调试模式
	 * 
	 */
	public void setDebugCondition(){
		deck=new Deck(new ArrayList<>());//deck里面应该没有东西了
		suitPile=new SuitPile[4];
		for(int i=0;i<4;i++)
			suitPile[i]=new SuitPile();
		hand=new Hand();
		sevPile=new SevPile[7];
		for(int i=0;i<6;i++){
			sevPile[i]=new SevPile(new ArrayList<>());
		}
		for(int i=0;i<4;i++){//遍历三种花色
			if(i<3)//
				for(int j=1;j<=13;j++){
					List<Poker> list=new ArrayList<>();
					list.add(new Poker(j,Suit.values()[i],true));
					suitPile[i].put(list);
				}
			else
				for(int j=1;j<=12;j++){
					List<Poker> list=new ArrayList<>();
					list.add(new Poker(j,Suit.values()[i],true));
					suitPile[i].put(list);
				}
		}
		List<Poker> list=new ArrayList<>();
		list.add(new Poker(13, Suit.values()[3],true));
		sevPile[6]=new SevPile(list);
	}
	public SuitPile[] getSuitPile() {
		return suitPile;
	}
	public void setSuitPile(SuitPile suitPile[]) {
		this.suitPile = suitPile;
	}
	public Hand getHand() {
		return hand;
	}
	public void setHand(Hand hand) {
		this.hand = hand;
	}
	/**返回Deck中的当前的Discard中的牌
	 * 
	 * @return
	 */
	public List<Poker> getCurDiscard(){
		if(deck.getCurDiscard()==null)//如果当前最上层为空
			return new ArrayList<>();//返回一个空的ArrayList
		//System.out.println("返回的Discard应该有值");
		return deck.getCurDiscard().getPokerList();	//返回当前的索引
	}
	/**从Deck中取出下一个Discard
	 * 
	 * @return
	 */
	public void nextDiscard(){
		deck.changeIndex();	//首先deck改变当前的索引
	}
	/**根据序号返回n对应的SuitPiles顶部的一张牌
	 * 
	 * @param n 序号
	 * @return 一张牌
	 */
	public Poker getSuitPileTop(int n){
		return suitPile[n].getTop();
	}
	/**根据序号取得SevPoker牌堆中的牌
	 * 
	 * @param n 序号
	 * @return
	 */
	public List<Poker> getSevPokers(int n){
		try{
		List<Poker> list=sevPile[n].getPokerList();
		//System.out.println(list);
		return list;
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			//System.out.println("报错");
			throw e;
		}
	}
	/**获取手中的牌
	 * 
	 * @return
	 */
	public List<Poker> getHandPokers(){
		return hand.getPokerList()==null?new ArrayList<>():hand.getPokerList();
	}
	/**返回当前deck是否为空
	 * 
	 * @return
	 */
	public boolean isDeckEmpty(){
		return deck.isEmpty();
	}
	/**将discard中的牌拿到手中
	 * 
	 * @param i
	 */
	public boolean takeFromDiscard(int i){
		Discard discard=deck.getCurDiscard();
		if(discard==null){
			hand.put(new ArrayList<>());
			return false;
		}
		else{
			lastPile=discard;
			hand.put(discard.get(i,level));
			return true;
		}
	}
	/**将SevPile中的牌拿到手上
	 * 
	 * @param n
	 * @param i
	 * @return 是否成功
	 */
	public boolean takeFromSev(int n,int i){
		SevPile sevPile=this.sevPile[n];
		List<Poker> list=sevPile.get(i);
		if(list==null){
			hand.put(new ArrayList<>());
			return false;
		}
		hand.put(list);
		lastPile=sevPile;
		return true;
	}
	/**将suitPile中的牌拿到手上
	 * 
	 * @param n
	 * @param i
	 * @return 是否成功
	 */
	public boolean takeFromSuit(int n){
		SuitPile suitPile=this.suitPile[n];
		List<Poker> list=suitPile.get(0);
		if(list==null){
			hand.put(new ArrayList<>());
			return false;
		}
		hand.put(list);
		lastPile=suitPile;
		return true;
	}
	/**向SuitPiles[n]放入手中的牌
	 * 
	 * @param n
	 */
	public void putToSuit(int n){
		List<Poker> list=hand.get(0);
		if(!suitPile[n].put(list))
			lastPile.putBack(list);
	}
	/**向SevPiles[n]放入手中的牌
	 * 
	 * @param n
	 */
	public void putToSev(int n){
		List<Poker> list=hand.get(0);
		if(!sevPile[n].put(list,level)){
			lastPile.putBack(list);
		}
	}
	/**扔回手中的牌
	 * 
	 */
	public void throwPokers(){
		if(lastPile!=null)
			lastPile.putBack(hand.get(0));
	}
	/**将对应id的牌翻到正面朝上
	 * 
	 * @param id
	 */
	public void upPoker(int id){
		sevPile[id].changeTopPoker();
	}
	/**判断是否胜利
	 * 
	 * @return
	 */
	public boolean isWin(){
		for(int i=0;i<4;i++){
			Poker top=suitPile[i].getTop();
			if(top==null)
				return false;
			if(top.getNumber()!=13)
				return false;
		}
		return true;
	}
}
